package org.pps.gl.server;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import org.pps.gl.client.LoginInfo;
import org.pps.gl.client.LoginService;
import org.pps.gl.server.datastore.Util;
import org.pps.gl.server.datastore.Utilisateur;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.appengine.api.datastore.Entity;

public class LoginServiceImpl extends RemoteServiceServlet implements
		LoginService {

	private static final long serialVersionUID = -3541385967467357090L;

	public LoginInfo login(String sessionid) {

		Entity user = Utilisateur.getCurrentUser(sessionid);

		LoginInfo loginInfo = new LoginInfo();

		if (user != null) {
			loginInfo = Infos.getInfo(loginInfo, user);
			loginInfo.setSessionId(sessionid);
		} else {
			loginInfo.setLoggedIn(false);
		}
		return loginInfo;
	}

	@Override
	public LoginInfo login(String email, String password) {
		Entity user = Utilisateur.getUtilisateur(email);
		LoginInfo loginInfo = new LoginInfo();
		// crypter le mot de passe
		try {
			password = UtilSHA1.SHA1(password);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		if (Utilisateur.checkLoginPassword(email, password)) {
			loginInfo=Infos.getInfo(loginInfo, user);
			String sid = Utilisateur.newSessionId(email);
			loginInfo.setSessionId(sid);			 
		} else {
			loginInfo.setLoggedIn(false);
		}
		return loginInfo;
	}
	
	@Override
	public boolean logout(String sessionid) {
		return Utilisateur.delSession(sessionid);
	}
	
	/**
	 * Méthode pour changer le mot de passe par l'utilisateur
	 */
	public boolean changerPassword (String email, String password) {
		Entity user = Utilisateur.getUtilisateur(email);
		if (user != null) {
			try {
				password = UtilSHA1.SHA1(password);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			user.setProperty("password", password);
			System.out.println("new password ds : "+user.getProperty("password"));
			Util.persistEntity(user);
			return true;
		}
		return false;
	}
	
	/**
	 * Méthode pour changer le mot de passe quand il a été oublié
	 */
	public boolean changerPassword (String email) {
		Entity user = Utilisateur.getUtilisateur(email);
		if (user != null) {
			String password = new String();
			Random rand = new Random();
	        password = String.valueOf(rand.nextInt(999998));
	        System.out.println("new password : "+password);
	        Email.sendMail(email, password);
	        System.out.println("old password ds : "+user.getProperty("password"));
	        try {
				password = UtilSHA1.SHA1(password);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			user.setProperty("password", password);
			System.out.println("new password ds : "+user.getProperty("password"));
			Util.persistEntity(user);
			
			return true;
		}
		
		return false;
	}
	
	/**
	 * Méthode pour vérifier le mot de passe d'un utilisateur
	 */
	public boolean verifPassword (String email, String password) {
		Entity user = Utilisateur.getUtilisateur(email);
		if (user != null) {
			try {
				password = UtilSHA1.SHA1(password);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			if (user.getProperty("password").equals(password))
					return true;
		}
		
		return false;
	}
}